package com.zlk.algorithm.huawei.leetcode.stack;

import org.junit.Test;

/**
 * @program: algorithm
 * @ClassName Code40_dailyTemperatures
 * @description:
 * 给定一个整数数组 temperatures ，表示每天的温度，返回一个数组 answer ，
 * 其中 answer[i] 是指对于第 i 天，下一个更高温度出现在几天后。
 * 如果气温在这之后都不会升高，请在该位置用 0 来代替。
 *
 * 示例 1:
 * 输入: temperatures = [73,74,75,71,69,72,76,73]
 * 输出: [1,1,4,2,1,1,0,0]
 * 示例 2:
 * 输入: temperatures = [30,40,50,60]
 * 输出: [1,1,1,0]
 * 示例 3:
 * 输入: temperatures = [30,60,90]
 * 输出: [1,1,0]
 * @author: slfang
 * @create: 2025-01-13 15:38
 * @Version 1.0
 **/
public class Code40_dailyTemperatures {

    @Test
    public void test(){
        //dailyTemperatures(new int[]{73,74,75,71,69,72,76,73});
        dailyTemperatures(new int[]{30,40,50,60});
    }

    //todo 单调栈求解


    public int[] dailyTemperatures(int[] T) {
        int length = T.length;
        int[] result = new int[length];

        //从右向左遍历
        for (int i = length - 2; i >= 0; i--) {
            // j+= result[j]是利用已经有的结果进行跳跃
            for (int j = i + 1; j < length; j+= result[j]) {
                if (T[j] > T[i]) {// 如果Tj 大于Ti说已经找到
                    result[i] = j - i;
                    break;
                } else if (result[j] == 0) {
                    //1、说明Tj小于Ti
                    //2、遇到0表示后面不会有更大的值，那当然当前值就应该也为0
                    // 因为Tj都比Ti小了都是为0了，后面就肯定找不到更大了
                    result[i] = 0;
                    break;
                }
            }
        }

        return result;
    }

    //30,40,20,30,50,60
    public int[] dailyTemperaturesError(int[] T) {
        int length = T.length;
        int[] result = new int[length];
        //从右向左遍历
        for (int i = length - 2; i >= 0; i--) {
            // j+= result[j]是利用已经有的结果进行跳跃
            int cur = T[i];
            if(cur==T[i+1]){
                result[i]=result[i+1]+1;
                continue;
            }
            for (int j = i+1; j < length; j+=result[j]) {
                if (T[j]>cur){
                    result[i]=j-i;
                    break;
                }else{
                    if(j==length-1&&result[j]==0){
                        result[i]=0;
                        break;
                    }
                }
            }
        }
        return result;
    }





}
